import puppeteer from "puppeteer";
// puppeteer 每一步操作都是异步的， 所以需要使用 async await
import { spawn } from 'child_process'   // 使用子进程的spwan方法调用其他文件

const argvText = process.argv[2];
// 1创建浏览器 打开
// headless : false 关闭无头模式， 可以看到浏览器打开的过程 (默认是true， 即无头模式)
const brower = await puppeteer.launch({ headless: false });  // 顶层await语法， 否则需要使用 async 函数

// 2创建页面
const page = await brower.newPage();      // 或者 async () => await brower.newPage()

// 3打开页面
await page.setViewport({ width: 1600, height: 960 });  // 设置视口大小， 原默认窗口比较小
await page.goto('https://www.juejin.cn');

// 4读取元素，自动点击，需要等待页面加载完成元素出现
await page.waitForSelector('.side-navigator-wrap')   // 侧边栏

// 5 $ 获取单个元素   $$ 获取多个元素
const elements = await page.$$('.side-navigator-wrap .nav-item-wrap span')

// 收集内容的函数
const collectFn = async () => {
    const titleList = []
    await page.waitForSelector('.entry-list')  // 文章列表
    const eles = await page.$$('.entry-list .title-row a')  // 标题内容
    for await (const el of eles) {
        const propTe = await el.getProperty('innerText')  
        const name = await propTe.jsonValue()   
        titleList.push(name)
    }
    // console.log(titleList);

    // 调用python生成词云图
    const pyProcess = spawn('python', ['index.py', titleList.join(',')])
    pyProcess.stdout.on('data', data => {
        console.log(data.toString());
    })
    pyProcess.stderr.on('data', data => {
        console.log(data.toString());
    })
    pyProcess.on('close', (code) => {
        console.log('close' + code);
    })
}

// 遍历 异步的
for await (const element of elements) {
    const prop = await element.getProperty('innerText')  // 读取元素内容 是一个 js对象 CdpJSHandle {}
    // console.log(prop);
    const text = await prop.jsonValue()    // 需要使用这个方法转文字
    // console.log(text);
    if(text === (argvText || '前端')) {        // 这个参数可以 接收 指令的参数
        await element.click()   // 点击一下
        collectFn()
    }
}

/*
执行  node index.js 后端
*/